老實說,前面討論的內容對於實際撰寫Quarkus代碼的關聯性並不強。不過,我個人認為,學習一個框架時,官方文件和示例代碼通常已經足夠完整,因此再編寫一些簡單的操作Lab,可能不會比官方文件更好。另一方面,前面提到的後端基礎知識,對於剛進入後端開發領域的工程師來說,其實非常重要。從我多年的工作經驗來看,能夠順暢闡述這些概念的工程師並不多,因為大多數開發工作都是站在巨人肩膀上,使用現有工具和框架完成任務。然而,如果想成為更資深的工程師,深入理解這些設計原理是不可或缺的。這將在設計系統時提供很大的幫助。
接下來,我們將專注於微服務架構這個話題。微服務在大型系統中是一個至關重要的設計模式,但要真正理解為何選擇這種架構,並非易事。我曾在知乎上看到過一個案例,講述了一個從單體架構逐步演進到微服務架構的過程,這對於剛開始設計單體應用的初學者來說,是一個很好理解為什麼要採用微服務的方式。
拍謝..閱讀之前,圖片我時間來不及修改,Ap Tier需改成 Web Tier,而Service Tier需改成Ap Tier。Web Tier一般定為有頁面的服務,而Ap Tier則是純服務。
在探討微服務架構之前,我們首先需要理解什麼不是微服務。通常與微服務相對的是單體應用(Monolithic Application),開發上會將所有功能都封裝在一個獨立單元的應用程式中。從單體應用到微服務並非一蹴可幾,而是一個漸進式的演進過程。接下來將以一個線上學習平台為例,詳細說明這個過程。
幾年前,工程師阿鵬和產品經理葉庭宇共同創立了一個線上學習平台新創公司。阿鵬負責後端開發,葉庭宇負責產品規劃和其他業務。當時線上教育市場還不飽和,只要基本功能實現就能獲得不錯的市場反應。因此他們的初始需求相對簡單:
考慮到需求簡單,阿鵬選擇了使用 Spring Boot 框架快速開發了一個 Java Web 應用。資料庫使用 MySQL,前端則採用 Vue.js 框架。為了安全考量,管理後台被設計為一個獨立的應用。
阿鵬使用 Docker 容器化應用程式,並部署到 AWS EC2 實例上。網站很快上線,獲得了不錯的口碑。
隨著用戶數量快速增長,競爭對手也紛紛湧現。為了保持競爭力,阿鵬和葉庭宇決定擴充平台功能:
為了應對這些新需求,阿鵬邀請了同學SI Yang加入團隊。SI Yang負責數據分析和行動端開發,阿鵬則專注於核心功能和效能優化。
由於開發時程緊迫,團隊沒有充分考慮架構設計,而是採取了一些權宜之計:
經過一段時間的密集開發,新功能陸續上線。此時的架構變成了這樣:
雖然開發完了,但這個階段可能會面臨一些問題如下:
然而,現有的架構也展現了一些優點:
認識到現有架構的問題後,阿鵬和SI Yang決定進行微服務化改造。他們首先梳理了業務邏輯,將系統拆分為以下幾個核心服務:
這個階段雖然將服務進行了拆分,但仍然使用共享的資料庫,因此仍存在一些問題:
為了解決這些問題,團隊決定進一步優化架構:
最終的微服務架構如下:
在此架構中:
上述為一個簡單從業務面複雜度提高的微服物演進的示意,可以看到幾個重點
但微服物運為複雜度高,需要更多的基礎建設管理,而網路延遲與資料一致性也是很大的問題! 最後是微服物需要更強大的監控工具與Trace Log,因為一個動作可能牽扯多個服務,沒有完整的Trace監控,很難發現問題出現在哪一個服務環節。
單體應用是指將整個系統的所有功能集中在一個應用程式內,這是很多系統在初期發展時的常見做法。舉例來說,像是上述線上學習平台的會員註冊、課程購買、資料庫管理等等,這些功能全都被整合在同一個應用程式裡面。架構具有以下幾個特點:
但是,當系統變得複雜,或是使用者數量暴增時,單體應用就會遇到一些問題:
微服務的核心概念是將應用程式拆分為多個小而獨立的服務,每個服務都專注於某一特定的功能,比如會員系統、訂單系統、課程系統等。這樣每個服務都可以獨立開發、部署和管理。微服務架構有以下幾個特點:
不過微服務架構也帶來不少挑戰:
以下是簡易的表格整理
特性 | 單體應用 | 微服務架構 |
---|---|---|
部署 | 一次部署整個應用 | 每個服務可獨立部署 |
擴展方式 | 垂直擴充 | 水平擴充,針對特定服務擴充 |
故障影響範圍 | 全系統可能受影響 | 故障只影響單一服務 |
開發複雜度 | 初期開發較簡單 | 需要額外處理服務間的溝通 |
資料管理 | 共用單一資料庫 | 每個服務有自己的資料庫 |
運維與監控 | 簡單集中 | 需要多重監控工具和追蹤系統 |
單體架構進化到微服務架構,是隨著系統規模和複雜度增加的一個自然演進。微服務架構適合那些希望能夠靈活擴展和管理,並且有較強技術能力支援的團隊或公司。
個人經驗上,建議不要為了微服物而去拆業務邏輯,其實單體也是有它的好處在,如果系統不是過於複雜且流量乘載也不是很巨量,其實單體反而是能快速滿足業務需求的選擇。具體參考依據考量如下
如果你的系統功能相對簡單,或是處於起步階段,單體架構會比較適合。單體架構容易開發、部署,並且可以快速交付,特別是當系統的功能比較有限時。當系統規模變大,功能模組越來越多時,維護單體架構的代價會變得更高,這時候再考慮微服務。
評估標準:
微服務架構適合用在需要高擴展性的系統中。舉例來說,如果系統某些部分(如登入系統或訂單處理系統)會因為使用量增加而需要更高的負載處理能力,微服務架構允許單獨擴展這些熱門服務,而不需要擴展整個應用。相比之下,單體應用的擴展方式較為局限,通常是透過垂直擴展(增加伺服器資源)來提高效能,但這樣很快會遇到物理限制。
評估標準:
如果你應用需要頻繁地更新功能、修復錯誤或進行版本迭代,微服務架構能夠提高部署靈活性,因為可以只更新需要改動的那部分服務,不需要重新部署整個應用。
評估標準:
微服務架構能夠實現更好的錯誤隔離。如果系統中的某個服務發生故障,不會影響到其他不相依業務羅及的服務正常運行。而在單體應用中,因為所有的功能都集中在一起,如果一個模組出現問題,直接噴Try Cache,可能會導致整個系統無法使用。
評估標準:
最後稍微提一下,有些語言會有相關的微服物框架可以直接使用, .NET Core最有名的叫Dapr (Distributed Application Runtime),有興趣可以去玩玩。